Comparable與Comparator的功能相近,但其實有不同的地方。
大家可以因應需求而選擇最好的方式。
首先它們有5個不同地方:
1, Comparable只可被用作物件中一個屬性的自然排序。
Comparator可被用作不同物件不同屬性的排序。
2, Comparable用“this” reference 與指定物件作比較。
Comparator用兩個不同的物件做比較。
3, Comparable在java.lang package內。
Comparator在java.util package內。
4, Comparable需要修改原來的class。
Comparator不需要修改原來的class。
5, Comparable提供compareTo() method來排序元素。
Comparator提供compare() method 和equals() method來排序元素。
這樣說可能會比較抽象,
大家可以看看以下例子。
相信大家看完之後會明白它們兩者實際的區別了。
例子:
import java.io.*;
import java.util.*;
// Class 'Movie' 實作Comparable interface
class Movie implements Comparable<Movie>
{
private double rating;
private String name;
private int year;
// 用年份排序
public int compareTo(Movie m)
{
return this.year - m.year;
}
// Constructor
public Movie(String nm, double rt, int yr)
{
this.name = nm;
this.rating = rt;
this.year = yr;
}
// Getter methods 目的是存取private元素rating、name、year。
public double getRating() { return rating; }
public String getName() { return name; }
public int getYear() { return year; }
}
// Class 比較rating
class RatingCompare implements Comparator<Movie>
{
public int compare(Movie m1, Movie m2)
{
if (m1.getRating() < m2.getRating()) return -1;
if (m1.getRating() > m2.getRating()) return 1;
else return 0;
}
}
// Class 比較name
class NameCompare implements Comparator<Movie>
{
public int compare(Movie m1, Movie m2)
{
return m1.getName().compareTo(m2.getName());
}
}
// 主class
class Main
{
public static void main(String[] args)
{
ArrayList<Movie> list = new ArrayList<Movie>();
list.add(new Movie("Force Awakens", 8.3, 2015));
list.add(new Movie("Star Wars", 8.7, 1977));
list.add(new Movie("Empire Strikes Back", 8.8, 1980));
list.add(new Movie("Return of the Jedi", 8.4, 1983));
// 以rating排序 :
// (1) 創建物件ratingCompare
// (2) 使用Collections.sort
// (3) 列印Sorted list
System.out.println("Sorted by rating");
RatingCompare ratingCompare = new RatingCompare();
Collections.sort(list, ratingCompare);
for (Movie movie: list)
System.out.println(movie.getRating() + " " +
movie.getName() + " " +
movie.getYear());
// 以name排序
// (1) 創建物件nameCompare
// (2) 使用Collections.sort
// (3) 列印Sorted list
System.out.println("\nSorted by name");
NameCompare nameCompare = new NameCompare();
Collections.sort(list, nameCompare);
for (Movie movie: list)
System.out.println(movie.getName() + " " +
movie.getRating() + " " +
movie.getYear());
//以year排序
System.out.println("\nSorted by year");
Collections.sort(list);
for (Movie movie: list)
System.out.println(movie.getYear() + " " +
movie.getRating() + " " +
movie.getName()+" ");
}
}
參考文章/網站/書本: